const obj = {
  name: 'why',
  age: 18
}

const objProxy = new Proxy(obj, {
  /**
   * 获取值时的捕获器
   * @param {Object} target // 访问的对象
   * @param {any} key // 访问的属性
   * @return {any}
  */
  get: function(target, key) {
    console.log(`监听到target对象的 ${key} 属性被访问`, target)
    return target[key]
  },

  /**
   * 设置值时的捕获器
   * @param {Object} target // 访问的对象
   * @param {any} key // 需要设置值的属性
   * @param {any} newVal // 设置的值
   * @return {any}
  */
  set: function(target, key, newVal) {
    console.log(`监听到target对象的 ${key} 属性被设置值`, target)
    target[key] = newVal
  },

  /**
   * 监听 in 操作符的捕获器
   * @param {Object} target // 访问的对象
   * @param {any} key // 需要判断的属性
   * @return {Boolean}
  */
   has: function(target, key) {
    console.log(`监听到target对象的 ${key} 属性 in 操作`, target)
    return key in target
  },

  /**
   * 监听 delete 操作符的捕获器
   * @param {Object} target // 访问的对象
   * @param {any} key // 需要删除的属性
   * @return {any}
  */
   deleteProperty: function(target, key) {
    console.log(`监听到target对象的 ${key} 属性 delete(删除) 操作`, target)
    delete target[key]
  },
})

// console.log(objProxy.name)
// console.log(objProxy.age)

// objProxy.name = 'jelly'
// objProxy.age = 22

// console.log(obj.name)
// console.log(obj.age)

// in 操作符
console.log('name' in objProxy)

// delete 操作
delete objProxy.name